About two weeks ago, my little brother told me about a game jam called Ankara Game Jam '25. I thought, “We’ve joined online game jams before, so why not try a physical one?” My brother suggested we attend wearing blue cloaks. I said, “Sure, why not?” We filled out the application form and waited for the results. Out of over 1,500 applicants, we got accepted!
Day 0 - Friday (Because indices start at 0)
I woke up and started working from home. I took a half-day off, finished my tasks, and then took a shower. I had already packed my backpack, including my MacBook and my work laptop, which I’d installed Fedora on. I met my brother at the designated meeting point, where we joined other participants. After a bus ride, we arrived at the venue.
I needed to write blogs for the following week, so I finished one before the game jam began. Then the event kicked off. The organizers announced the theme: “Out of Control.”
My brother and I had initially planned to create a chess game with a unique twist and board design, adapting it to fit the theme. However, we scrapped that idea. After 30 minutes of brainstorming and eight game concepts, we decided what we wouldn’t control. We settled on a self-playing Tetris game where players would battle each other as blocks fell. We chose to model the characters after ourselves—wizards in blue cloaks. We created pixel art versions of our characters.
We donned our cloaks and mingled with other participants, who loved our costumes. After a soup dinner, we returned to our seats and started working on the game.
We decided to use the Godot Engine for this project. Godot uses GDScript, a language similar to Python. As two Python veterans, we thought this would be a breeze. I began prototyping a Finite State Machine for our characters, while my brother worked on character animations. While waiting for his assets, I used mock-up assets to prototype the game. Double jump, keyboard, and gamepad controls worked well, but I didn’t implement a Coyote Time mechanic—a mistake I realized after the jam.
Day 1 - Saturday
I didn’t sleep at all during these two days. I set up a tilemap system for static blocks unaffected by Tetris mechanics and another for the Tetris blocks. I also implemented a spell-casting mechanic for our characters. Unfortunately, I didn’t integrate the spell mechanics directly into the state machine. In fact, we switched the spell-casting system four times: first without states, then with states, then back to without states, and finally with states again. As you can imagine, this wasted a lot of time.
We planned to include six spells in total, with two buttons per player to cast spells. Spells would vary depending on the character’s state: two for walking/idle, two for blocking, and two for jumping. The game would check the current state and cast the appropriate spell.
My brother worked on the falling block mechanic. We had previously coded a Tetris game using PyGame and Python, and since GDScript is similar to Python, he adapted our old PyGame code for the Tetris block spawning system. It worked, but making the blocks Rigid Bodies caused issues—they were affected by gravity and other forces. So, we switched to using a tilemap for the falling blocks. When a block hit the ground, it would be destroyed, and the tilemap would update. However, this wasn’t enough. We needed to convert the Rigid Body into an Animatable Body, which is controlled entirely by code. This was exactly what we needed.
Day 2 - Sunday
I only slept for 40 minutes this day—my brother finally convinced me to rest. I was exhausted.
One major challenge in a self-playing Tetris game is clearing lines, as the AI wouldn’t play optimally. To address this, I added a laser beam mechanic. The laser would choose a line to destroy and clear it at regular intervals, making the game more dynamic. The laser could also harm players if they touched it.
At this point, the game was playable, and the core mechanics were functional. Players’ spells couldn’t kill opponents directly but could stun them, causing a temporary loss of control. Stunning was the game’s main mechanic. To defeat an opponent, a player had to stun them and let a Tetris block fall on them or allow them to fall into the void. The first player to die five times would lose, and the other would win.
I coded a global script for score management and connected it to the UI, displaying stars and incrementing the score when a player died. I also created a main menu and a game-over screen. Unfortunately, we didn’t have time to make the game restartable.
As I mentioned, rewriting the spell-casting mechanic four times cost us dearly. We only managed to implement a fireball for attacking and a shield sphere for defending. Still, the game was playable.
The organizers announced that we needed to submit the game to itch.io and upload a gameplay video to YouTube. I was frustrated because we hadn’t been informed about this requirement earlier. The venue’s Wi-Fi was unreliable, and our phones weren’t working well. It took me an hour to install OBS and Kdenlive on my laptop, and another 30 minutes to record and upload a gameplay video to YouTube.
Finally, time was up. We moved to the conference room, where teams presented their games and voted in five categories. I jokingly said, “Just give me my prize,” but my brother didn’t think we’d win anything. To our surprise, we won Best Game Mechanics! I was confident we’d take this category because our mechanic was truly unique.
Two other games had solid mechanics, but they were heavily inspired by Carry On and Titan Souls. Our game resembled Wario’s Woods in some ways, but instead of placing blocks, players fought each other in a Tetris arena.
Our friends congratulated us, and we received a plaque and 3D-printed coins with cogs, the symbol of the Best Game Mechanics category.
I was beyond exhausted. I boarded the bus, went home, and slept for nine hours before waking up for work. 🥹 It was tough, but I had to push through.
So Here is the Game
Itch.io page is here!
You can download the game for Linux x86_64, Linux Arm64, Windows x86_64, Windows Arm64, MacOS universal and finally for Web.
What I Dealt With
- Resolving merge conflicts while collaborating in Godot with two people (imports generated random IDs).
- Implementing a Finite State Machine for the character controller and laser beam.
- Manipulating tilemaps at runtime.
- Creating a global score system.
- Designing a menu with Godot’s built-in UI, controllable with a gamepad.
- Developing a spell-casting mechanic.
- Creating custom classes for the game.
- Using composition instead of inheritance.
- Producing 8-bit sound effects with LMMS (Let’s Make Music Software).
- Creating pixel art with LibreSprite (an open-source alternative to Aseprite).
- Editing spritesheets with GIMP 3 (released after 20 years!).
- Recording a gameplay video with OBS and uploading it to YouTube.
- Realizing I needed to preload assets for the web version, as loading assets blocked the main thread.
Conclusion
I had an amazing time with my brother. I learned a ton, met new people, and created a game I’m proud of. We’ve decided to keep working on Tetrabros, rewriting it to add more features, game modes, and levels. I feel great about this experience and can’t wait to see where this project takes us!
Album of the day: